home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1994 January / PSL Monthly Shareware CD-ROM (Public Software Library) (January 1994).iso / games / dos / arcade / lem.bas (.txt) < prev    next >
Encoding:
GW-BASIC  |  1984-07-21  |  7.3 KB  |  303 lines

  1. 10  ' *****************
  2. 20  ' **     LEM     **
  3. 30  ' *****************
  4. 40  '
  5. 50  SCREEN 1
  6. 60  CLS
  7. 70  KEY OFF
  8. 80  LOCATE 2,7
  9. 90  PRINT "* * *  OUT ON A LEM  * * *
  10. 100  LOCATE 5,1
  11. 110  PRINT "A challenging game of skill ...
  12. 120  LOCATE 7,1
  13. 130  PRINT "Use the special function keys F1
  14. 140  PRINT "through F3 to run your left, right,
  15. 150  PRINT "and vertical thrusters.  You are to
  16. 160  PRINT "land the lunar excursion module (LEM)
  17. 170  PRINT "as gently and accurately as possible.
  18. 180  PRINT
  19. 190  PRINT "Turn a given thruster off by pressing
  20. 200  PRINT "the same key a second time.
  21. 210  PRINT
  22. 220  PRINT "Watch your fuel supply!
  23. 230  PRINT
  24. 240  PRINT "If you have fuel left, the onboard
  25. 250  PRINT "computer will -attempt- to return
  26. 260  PRINT "you to earth ...
  27. 270  '
  28. 280  LOCATE 25,9
  29. 290  PRINT "Press any key to begin, <F10> TO END";
  30. 300  '
  31. 310  ' Starting point for each landing attempt
  32. 320  IF LEN(INKEY$) THEN 320
  33. 330  K$ = INKEY$
  34. 340  IF K$ = "" THEN 330
  35. 350  '
  36. 360  COLOR 0,1
  37. 370  CLS
  38. 380  '
  39. 390  ' Activate engine keys
  40. 400  ON KEY(1) GOSUB 1990
  41. 410  ON KEY(2) GOSUB 2030
  42. 420  ON KEY(3) GOSUB 2070
  43. 424  ON KEY(10) GOSUB 4000
  44. 430  KEY (1) ON
  45. 440  KEY (2) ON
  46. 450  KEY (3) ON
  47. 455  KEY (10) ON
  48. 460  '
  49. 470  ' A different game each second of the hour
  50. 480  T$ = MID$(TIME$,4,2) + MID$(TIME$,7)
  51. 490  RANDOMIZE VAL(T$)
  52. 500  '
  53. 510  ' Build the space ship image
  54. 520  LINE (3,1)-(5,5),2,BF
  55. 530  LINE (2,2)-(6,4),2,BF
  56. 540  LINE (1,7)-(2,6),3
  57. 550  LINE (6,6)-(7,7),3
  58. 560  DIM SHIP(7)
  59. 570  GET (0,0)-(8,8),SHIP
  60. 580  '
  61. 590  ' Build vertical exhaust image
  62. 600  LINE (9,1)-(11,1)
  63. 610  DIM EXHAUSTX(1)
  64. 620  GET (9,1)-(11,1),EXHAUSTX
  65. 630  '
  66. 640  ' Build horizontal exhaust image
  67. 650  LINE (1,9)-(1,12)
  68. 660  DIM EXHAUSTY(1)
  69. 670  GET (1,9)-(1,12),EXHAUSTY
  70. 680  '
  71. 690  ' Sprinkle a few stars around
  72. 700  CLS
  73. 710  FOR I = 1 TO 300
  74. 720  PSET (320*RND,200*RND)
  75. 730  NEXT I
  76. 740  '
  77. 750  ' Draw the earth
  78. 760  CIRCLE (277,63),25,1
  79. 770  PAINT (277,63),1
  80. 780  DRAW "c3bm272,42r7d1r4l13d1l4r22d1l24g1r23l3d1l20"
  81. 790  DRAW "r3d1r14l4d1l8c2l3u1l1d2r18e3l1g1l2f1l5d2r4"
  82. 800  DRAW "l16d1r14d1l15d1r14g1l13d1r13g1l13"
  83. 810  DRAW "d1r13f2l1h3l3g1l8d1r6g1l4f1r3f1l3f1r6u2l1d1l1"
  84. 820  DRAW "d2l3r5d1r1g1r13l2u1l7e1r3d3r7l15f1r15f1l16"
  85. 830  DRAW "g1r21d1l21f1r20g1l18f1r17g1l15"
  86. 840  DRAW "f1r13d1l13d1r11d1l11d1r9g1l7g1r6g1l4d1r2l5"
  87. 850  DRAW "bm273,54c1u1e1r1f2"
  88. 860  DRAW "c3bd2l2bl2bu1l2h1l1bd4l3h1l3h1l2h1l1"
  89. 870  DRAW "bg5r1f2r1f1r5u1l3"
  90. 880  DRAW "bm273,79r1f1d1l3h1l1h2u2e3r2e1r9l3h1l4"
  91. 890  DRAW "bh2e1r4e1r7l3e2r1"
  92. 900  '
  93. 910  ' Choose site for landing pad
  94. 920  XL = 140 + 50 * RND
  95. 930  YL = 180 - 10 * RND
  96. 940  '
  97. 950  ' Create topographical features of moon
  98. 960  M1 = M2
  99. 970  M2 = M1 + 37 * RND
  100. 980  IF M2 > 319 THEN M2 = 319
  101. 990  H1 = H2
  102. 1000  H2 = 190 - 70 * RND
  103. 1010  IF H1 = 0 THEN 990
  104. 1020  IF M2 < XL - 39 THEN 1050
  105. 1030  IF M2 > XL + 39 THEN 1050
  106. 1040  H2 = YL
  107. 1050  LINE (M1,H1)-(M2,H2),1
  108. 1060  IF M2 < 319 THEN 960
  109. 1070  PAINT (0,199),1
  110. 1080  '
  111. 1090  ' Draw the landing pad
  112. 1100  LINE (XL-3,YL)-(XL+3,YL+2),,BF
  113. 1110  '
  114. 1120  ' Slightly random starting location for ship
  115. 1130  SHIPX = 50 * RND
  116. 1140  SHIPY = 20 * RND
  117. 1150  '
  118. 1160  ' Slightly random starting velocity for ship
  119. 1170  VELX = 7 + RND * 3
  120. 1180  VELY = 1 + RND
  121. 1190  '
  122. 1200  ' Starting conditions
  123. 1210  PUT (SHIPX,SHIPY),SHIP,XOR
  124. 1220  FACTOR = 0.1
  125. 1230  FUEL = 999
  126. 1240  THRUSTUP = 3
  127. 1250  '
  128. 1260  ' Main flight loop starts here
  129. 1270  PULSE = PULSE MOD 7 + 1
  130. 1280  IF PULSE = 1 THEN SOUND 1200-FUEL/5,1
  131. 1290  IF THRUSTUP < 0 THEN FUEL = FUEL - 9.7
  132. 1300  IF THRUSTSIDE THEN FUEL = FUEL - 5.3
  133. 1310  IF FUEL < 0 THEN FUEL = 0
  134. 1320  IF FUEL > 99 THEN 1460
  135. 1330  SOUND 99,0
  136. 1340  IF FUEL > 0 THEN SOUND 400,1
  137. 1350  IF FUEL > 0 THEN 1460
  138. 1360  '
  139. 1370  ' No more fuel left, disengage engines
  140. 1380  SOUND 2000,1
  141. 1390  KEY (1) OFF
  142. 1400  KEY (2) OFF
  143. 1410  KEY (3) OFF
  144. 1420  THRUSTUP = 3
  145. 1430  THRUSTSIDE = 0
  146. 1440  '
  147. 1450  ' Compute new velocities and positions
  148. 1460  VELX = VELX + FACTOR * THRUSTSIDE * 3
  149. 1470  OLDX = SHIPX
  150. 1480  SHIPX = SHIPX + FACTOR * VELX * 3
  151. 1490  VELY = VELY + FACTOR * THRUSTUP
  152. 1500  OLDY = SHIPY
  153. 1510  SHIPY = SHIPY + FACTOR * VELY
  154. 1520  '
  155. 1530  ' Put exhaust images in view if necessary
  156. 1540  IF THRUSTSIDE < 0 THEN PUT (SHIPX+7,SHIPY+3),EXHAUSTX,XOR : FLGL = 1
  157. 1550  IF THRUSTSIDE > 0 THEN PUT (SHIPX-2,SHIPY+3),EXHAUSTX,XOR : FLGR = 1
  158. 1560  IF THRUSTUP < 0 THEN PUT (SHIPX+4,SHIPY+7),EXHAUSTY,XOR : FLGU = 1
  159. 1570  '
  160. 1580  ' Have we drifted off screen?
  161. 1590  IF SHIPY < 0 THEN 1910
  162. 1600  IF SHIPX < 2 THEN 1910
  163. 1610  IF SHIPX > 308 THEN 1910
  164. 1620  '
  165. 1630  ' Erase old ship image via XOR to preserve background
  166. 1640  PUT (OLDX,OLDY),SHIP,XOR
  167. 1650  '
  168. 1660  ' Draw new ship image, XOR onto background
  169. 1670  PUT (SHIPX,SHIPY),SHIP,XOR
  170. 1680  '
  171. 1690  ' Erase the exhaust images if necessary
  172. 1700  IF FLGL THEN PUT (SHIPX+7,SHIPY+3),EXHAUSTX,XOR : FLGL = 0
  173. 1710  IF FLGR THEN PUT (SHIPX-2,SHIPY+3),EXHAUSTX,XOR : FLGR = 0
  174. 1720  IF FLGU THEN PUT (SHIPX+4,SHIPY+7),EXHAUSTY,XOR : FLGU = 0
  175. 1730  '
  176. 1740  ' Skip landing check for awhile if returning to earth
  177. 1750  IF LAND <= 0 THEN 1800
  178. 1760  LAND = LAND - 0.07
  179. 1770  GOTO 1840
  180. 1780  '
  181. 1790  ' Are landing pads touching the moon (and not the earth)?
  182. 1800  IF POINT (SHIPX,SHIPY+8) = 1  AND SHIPY > 85 THEN 2110
  183. 1810  IF POINT (SHIPX+8,SHIPY+8) = 1 AND SHIPY > 85 THEN 2110
  184. 1820  '
  185. 1830  ' Update the fuel supply
  186. 1840  LOCATE 25,16
  187. 1850  PRINT USING "FUEL ###";FUEL;
  188. 1860  '
  189. 1870  ' Keep on flying
  190. 1880  GOTO 1270
  191. 1890  '
  192. 1900  ' We just drifted off screen
  193. 1910  CLS
  194. 1920  LOCATE 12,4
  195. 1930  IF LAND = 0 THEN PRINT "MISSION ABORTED, RETURN TO EARTH"
  196. 1940  IF LAND <> 0 THEN PRINT "       WELCOME HOME HERO!       "
  197. 1950  IF LAND <> 0 THEN PLAY "L4 DEEEDEF L1 E"
  198. 1960  RUN 320
  199. 1970  '
  200. 1980  ' Subroutine F1 ... left engine control
  201. 1990  THRUSTSIDE = -(THRUSTSIDE <> 1)
  202. 2000  RETURN
  203. 2010  '
  204. 2020  ' Subroutine F2 ... right engine control
  205. 2030  THRUSTSIDE = (THRUSTSIDE <> -1)
  206. 2040  RETURN
  207. 2050  '
  208. 2060  ' Subroutine F3 ... vertical engine control
  209. 2070  THRUSTUP = 7 * (THRUSTUP = 3) - 3 * (THRUSTUP = -7)
  210. 2080  RETURN
  211. 2090  '
  212. 2100  ' We landed! But how did we fare?
  213. 2110  LOCATE 1,1
  214. 2120  VEL = ABS(VELX) + ABS(VELY)
  215. 2130  IF VEL < 4 THEN 2350
  216. 2140  '
  217. 2150  ' Disintegrating ship, parts streaking out from crater
  218. 2160  PRESET (SHIPX+4,SHIPY+8)
  219. 2170  FOR I = 1 TO VEL * 0.7
  220. 2180  DELX = 9 * VEL * (RND-0.5)
  221. 2190  DELY = 7 * VEL * (-RND)
  222. 2200  DRAW "C2 NM+=DELX;,=DELY;"
  223. 2210  NEXT I
  224. 2220  '
  225. 2230  ' Fast enough to dig new crater?
  226. 2240  IF VEL < 8 THEN 2300
  227. 2250  PRT$ = "New crater is #### meters wide ...          "
  228. 2260  PRINT USING PRT$ ; VEL * VEL / 7
  229. 2270  GOTO 2780
  230. 2280  '
  231. 2290  ' Landing was too rough, sorry
  232. 2300  PRINT "Damaged beyond repair ...              "
  233. 2310  PRINT "Enjoy your stay !          ";
  234. 2320  GOTO 2780
  235. 2330  '
  236. 2340  ' Landed ok, just how well did you do?
  237. 2350  IF VEL < 3 THEN 2390
  238. 2360  PRINT "Fairly soft landing              "
  239. 2370  GOTO 2570
  240. 2380  '
  241. 2390  IF VEL < 2 THEN 2430
  242. 2400  PRINT "Nice job! ";
  243. 2410  GOTO 2570
  244. 2420  '
  245. 2430  IF VEL < 1 THEN 2470
  246. 2440  PRINT "Excellent soft landing!";
  247. 2450  GOTO 2570
  248. 2460  '
  249. 2470  IF SHIPX-XL+4 < 3 THEN 2510
  250. 2480  PRINT "Superior landing job!";
  251. 2490  GOTO 2570
  252. 2500  '
  253. 2510  PRINT "The President calls with his";
  254. 2520  LOCATE 2,1
  255. 2530  PRINT "congratulations on a superb landing!";
  256. 2540  GOTO 2740
  257. 2550  '
  258. 2560  ' Ok, so how close to the landing pad are you?
  259. 2570  DIS = ABS(SHIPX-XL+4) + ABS(SHIPY-YL+8)
  260. 2580  LOCATE 2,1
  261. 2590  IF DIS < 50 THEN 2630
  262. 2600  PRINT "But you're way out in the boonies!";
  263. 2610  GOTO 2740
  264. 2620  '
  265. 2630  IF DIS < 10 THEN 2670
  266. 2640  PRINT "But you missed the landing site!";
  267. 2650  GOTO 2740
  268. 2660  '
  269. 2670  IF DIS < 3 THEN 2710
  270. 2680  PRINT USING "But you missed the spot by ## meters.";DIS
  271. 2690  GOTO 2740
  272. 2700  '
  273. 2710  PRINT "And you landed right on target!";
  274. 2720  '
  275. 2730  ' Music for good landings ...
  276. 2740  PLAY "o4t128mll6cmsc#e-.mlc mse-c#c.mlcmsffl1f"
  277. 2750  GOTO 2810
  278. 2760  '
  279. 2770  ' Music for disastrous landings ...
  280. 2780  PLAY "mst64l6n3n7n3n7l3n2"
  281. 2790  '
  282. 2800  ' Shall we try a return to earth?
  283. 2810  IF (FUEL <> 0) AND (VEL < 4 ) THEN 2820 ELSE RUN 320
  284. 2820  LOCATE 1,1
  285. 2830  PRINT "Earth calling - return home                   ";
  286. 2840  LOCATE 2,1
  287. 2850  PRINT "                                              ";
  288. 2860  VELX = 0
  289. 2870  VELY = -1
  290. 2880  LAND = 1
  291. 2890  THRUSTUP = -7
  292. 2900  THRUSTSIDE = 0
  293. 2910  FOR Z = 1 TO 2000
  294. 2920  NEXT Z
  295. 2930  LOCATE 1,1
  296. 2940  PRINT "LEM computer engaged - returning home         ";
  297. 2950  KEY (1) OFF
  298. 2960  KEY (2) OFF
  299. 2970  KEY (3) OFF
  300. 2980  IF LEN(INKEY$) THEN 2980
  301. 2990  GOTO 1270
  302. 4000  CLS:SYSTEM
  303.